package Day13.作用域;

/**
 * 注意事项和使用细节
 * 1.属性和局部变量可以重名，访问是遵循就近原则
 * 2.在同一个作用域中，比如在同一个成员方法中，两个局部变量，不能重名
 * 3.属性的声明周期较长，伴随着对象的创建而创建，伴随着对象的销毁而销毁，局部变量声明周期较短，伴随着
 * 代码块的执行而创建，伴随着代码块的结束而销毁 即一次方法的调用过程中
 * 4.作用域的范围不同：
 * 全局变量/属性：可以被本类中使用，或者其他类使用（通过对象调用）
 * 局部变量：只能在本类中对应的方法中使用
 * 5.修饰符的不同：
 * 全局变量/属性可以加修饰符
 * 局部变量不可以加修饰符
 */
public class Demo02 {
    public static void main(String[] args) {
        Person p = new Person();
        //属性的声明周期较长，伴随着对象的创建而创建，伴随着对象的销毁而销毁，局部变量声明周期较短，伴随着
        //代码块的执行而创建，伴随着代码块的结束而销毁 即一次方法的调用过程中
        p.say();//当我们执行这个say方法的时候，say方法的局部变量比如说name会创建，当say执行完毕后
        //name的局部变量就会被销毁，但是属性（全局变量）仍然可以使用
        Q q1 = new Q();
        q1.test();//第一种跨类访问对象属性的方式
        q1.test2(p);//第二种跨类访问对象属性的方式
    }
}

class Q {
    //全局变量/属性：可以被本类中使用，或者其他类使用（通过对象调用）
    public void test() {
        Person p1 = new Person();
        System.out.println(p1.name);//陈工
    }

    public void test2(Person p) {
        System.out.println(p.name);
    }
}

class Person {
    //全局变量/属性可以加修饰符
    //局部变量不可以加修饰符
    public int age = 20;
    String name = "陈工";

    public void say() {
        //1.属性和局部变量可以重名，访问是遵循就近原则
        String name = "King";
        System.out.println("say（）name被调用" + name);
    }

    public void hi() {
        String address = "西安";
        //String address="上海"; 错误
        String name = "sx"; //可以
    }
}